package demo04;

import lombok.Getter;

import java.util.Comparator;
import java.util.PriorityQueue;

// 学生类，包含姓名、语文成绩和数学成绩
@Getter
class Student {
    // 获取学生姓名
    private String name;
    // 获取语文成绩
    private int chineseScore;
    // 获取数学成绩
    private int mathScore;

    // 构造函数
    public Student(String name, int chineseScore, int mathScore) {
        this.name = name;
        this.chineseScore = chineseScore;
        this.mathScore = mathScore;
    }

    @Override
    public String toString() {
        return "Student{" +
                "name='" + name + '\'' +
                ", 总成绩=" + (chineseScore + mathScore) +
                '}';
    }
}

// 学生比较器，用于定义 PriorityQueue 的排序规则
class StudentComparator implements Comparator<Student> {
    @Override
    public int compare(Student s1, Student s2) {
        // 比较总成绩，实现降序排序（总成绩高的优先级高）
        return Integer.compare(s2.getChineseScore() + s2.getMathScore(),
                s1.getChineseScore() + s1.getMathScore());
    }
}

public class PriorityQueueComparatorExample {

    public static void main(String[] args) {
        // 创建一个按照总成绩降序排序的优先级队列，使用自定义的 StudentComparator
        PriorityQueue<Student> queue = new PriorityQueue<>(new StudentComparator());

        // 添加学生元素
        queue.offer(new Student("Hanserwei", 80, 90)); // Hanserwei 总成绩 170
        System.out.println(queue);
        queue.offer(new Student("LikeYY", 95, 95));    // LikeYY 总成绩 190
        System.out.println(queue);
        queue.offer(new Student("Hanserwu", 90, 95));  // Hanserwu 总成绩 185
        System.out.println(queue);
        queue.offer(new Student("Hanser", 90, 80));    // Hanser 总成绩 170
        // 当总成绩相同时，PriorityQueue 的具体排序取决于内部实现，这里是添加顺序。
        // 但在取出时，仍会优先取出总成绩更高的。
        System.out.println(queue);

        System.out.println("按总成绩从高到低取出学生：");
        // 循环取出并打印队列中的元素，直到队列为空
        while (!queue.isEmpty()) {
            System.out.print(queue.poll() + " ");
        }
        System.out.println(); // 换行
    }
}